﻿using AiChiTu.TraceabilitySystem.Domain.AiChiTuManagement;
using AiChiTu.TraceabilitySystem.Domain.QiNiuYun;
using AiChiTu.TraceabilitySystem.ErrorCode;
using AiChiTu.TraceabilitySystem.Write.API.Applications.Commands.Breedings;
using AiChiTu.TraceabilitySystem.Write.API.Applications.Commands.ProductBasices;
using AutoMapper;
using MediatR;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Qiniu.Http;
using Qiniu.Storage;
using Qiniu.Util;

namespace AiChiTu.TraceabilitySystem.Write.API.Controllers
{
	/// <summary>
	/// 写-信息管理控制器
	/// </summary>
	[Route("api/[controller]/[action]")]
	[ApiController]
	public class ManagementWriteController : ControllerBase
	{
		/// <summary>
		/// 中介者
		/// </summary>
		private readonly IMediator mediator;
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="mediator">中介者</param>
		public ManagementWriteController(IMediator mediator)
		{
			this.mediator = mediator;
		}
		/// <summary>
		/// 添加商品基础信息请求
		/// </summary>
		/// <param name="request">添加商品基础信息请求命令</param>
		/// <returns>返回任务</returns>
		[HttpPost]
		public async Task<APIResult<bool>> CreateProductBasics(CreateProductBasicsCommand request)
		{
			return await mediator.Send(request);
		}
		/// <summary>
		/// 修改商品基础信息请求
		/// </summary>
		/// <param name="request">修改商品基础信息请求命令</param>
		/// <returns>返回任务</returns>
		[HttpPut]
		public async Task<APIResult<bool>> UpdateProductBasics(UpdateProductBasicsCommand request)
		{
			return await mediator.Send(request);
		}
		/// <summary>
		/// 批量删除商品基础信息请求
		/// </summary>
		/// <param name="request">批量删除商品基础信息请求命令</param>
		/// <returns>返回任务</returns>
		[HttpDelete]
		public async Task<APIResult<bool>> DeletedProductBasics([FromQuery] DeletedProductBasicsCommand request)
		{
			return await mediator.Send(request);
		}
		/// <summary>
		/// 上传文件
		/// </summary>
		/// <param name="file">上传的图片文件</param>
		/// <returns></returns>
		[HttpPost] // 指定该方法处理 HTTP POST 请求
		public async Task<IActionResult> UploadImages(IFormFile file) // 定义一个异步方法，接收一个文件类型的参数
		{
			if (file == null || file.Length == 0) // 检查文件是否为空或文件大小
			{
				return BadRequest("文件不能为空");
			}

			string saveKey = "Pic/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + file.FileName; // 设置上传文件保存的路径和文件名,可以随便输入 不用创建可自动生成
			string bucket = "aichitu-traceabilitysystem"; // 七牛云存储空间名称   七牛云仓库名称
			Mac mac = new Mac("J-1LPbPeA03XRjbaIN4WgW3oqL384y5xPHYnHYf8", "JTahXGCySEJsABYqL7m2tRrq9DOSTfOA_BJ4NAmH"); // 替换为您七牛云账号的访问密钥和密钥

			// 设置上传策略
			PutPolicy putPolicy = new PutPolicy();
			putPolicy.Scope = bucket + ":" + saveKey; // 设置 Scope 为具体的文件路径，即指定存储空间和保存路径

			// 创建上传凭证
			string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); // 生成上传凭证，凭证包含了上传策略信息

			// 配置上传管理器
			Config config = new Config();
			config.Zone = Zone.ZONE_CN_North; // 设置上传区域，这里是华北区域   自己选的区域,这个是华北,别的自己搜一下
			config.UseHttps = true; // 使用 HTTPS 进行上传
			config.UseCdnDomains = true; // 使用 CDN 域名加速上传
			config.ChunkSize = ChunkUnit.U512K; // 设置分块上传的块大小

			// 实例化表单上传对象
			FormUploader target = new FormUploader(config);

			// 上传文件
			HttpResult result = target.UploadStream(file.OpenReadStream(), saveKey, token, null); // 调用上传方法，上传文件流，传入保存路径和上传凭证

			// 检查上传结果
			if (result.Code == 200) // 判断上传是否成功（返回状态码200表示成功）
			{
				return Ok("http://sq4ffw1jy.hb-bkt.clouddn.com/" + saveKey); // 返回200响应，上传成功，返回文件名
			}
			else
			{
				return BadRequest("上传失败：" + result.Text); // 如果上传失败，返回400错误响应，包含错误信息
			}
		}
		/// <summary>
		/// 修改养殖信息
		/// </summary>
		/// <param name="request">修改养殖信息请求命令</param>
		/// <returns>返回任务</returns>
		[HttpPut]
		public async Task<APIResult<bool>> UpdateBreeding(UpdateBreedingCommand request)
		{
			return await mediator.Send(request);
		}
	}
}
